package com.sky.common.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 课程编号生成工具类
 * 生成8位唯一的课程编号字符串
 */
public class CourseCodeUtil {
    
    // 用于生成序列号的原子计数器
    private static final AtomicLong sequence = new AtomicLong(0);
    
    // 随机数生成器
    private static final Random random = new Random();
    
    // 时间格式化器，用于提取时间部分
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMdd");
    
    /**
     * 生成8位唯一的课程编号
     * 格式：YYMMDDXX（年月日+2位随机数）
     * 
     * @return 8位课程编号字符串
     */
    public static String generateCourseCode() {
        // 获取当前日期的前6位（YYMMDD）
        String datePart = LocalDateTime.now().format(formatter);
        
        // 生成2位随机数（00-99）
        int randomPart = random.nextInt(100);
        String randomStr = String.format("%02d", randomPart);
        
        // 组合生成8位编码
        return datePart + randomStr;
    }
    
    /**
     * 生成8位唯一的课程编号（带序列号版本）
     * 格式：YYMMDDSS（年月日+2位序列号）
     * 
     * @return 8位课程编号字符串
     */
    public static String generateCourseCodeWithSequence() {
        // 获取当前日期的前6位（YYMMDD）
        String datePart = LocalDateTime.now().format(formatter);
        
        // 获取序列号（00-99），使用原子计数器保证线程安全
        long seq = sequence.incrementAndGet() % 100;
        String seqStr = String.format("%02d", seq);
        
        // 组合生成8位编码
        return datePart + seqStr;
    }
    
    /**
     * 生成8位唯一的课程编号（混合版本）
     * 格式：YYMMDDRS（年月日+1位随机数+1位序列号）
     * 
     * @return 8位课程编号字符串
     */
    public static String generateCourseCodeMixed() {
        // 获取当前日期的前6位（YYMMDD）
        String datePart = LocalDateTime.now().format(formatter);
        
        // 生成1位随机数（0-9）
        int randomDigit = random.nextInt(10);
        
        // 获取序列号（0-9），使用原子计数器保证线程安全
        long seq = sequence.incrementAndGet() % 10;
        
        // 组合生成8位编码
        return datePart + randomDigit + seq;
    }
    
    /**
     * 检查课程编号是否有效（8位数字）
     * 
     * @param courseCode 课程编号
     * @return 是否有效
     */
    public static boolean isValidCourseCode(String courseCode) {
        if (courseCode == null || courseCode.length() != 8) {
            return false;
        }
        return courseCode.matches("\\d{8}");
    }
    
    /**
     * 获取课程编号的日期部分
     * 
     * @param courseCode 课程编号
     * @return 日期部分（YYMMDD）
     */
    public static String getDateString(String courseCode) {
        if (courseCode != null && courseCode.length() >= 6) {
            return courseCode.substring(0, 6);
        }
        return null;
    }
    
    /**
     * 获取课程编号的后缀部分
     * 
     * @param courseCode 课程编号
     * @return 后缀部分（如：XX）
     */
    public static String getSuffix(String courseCode) {
        if (courseCode != null && courseCode.length() == 8) {
            return courseCode.substring(6);
        }
        return null;
    }
    
    // 测试方法
    public static void main(String[] args) {
        System.out.println("=== 生成8位课程编号测试 ===");
        
        // 测试不同版本的生成方法
        for (int i = 0; i < 5; i++) {
            System.out.println("随机版本: " + generateCourseCode());
            System.out.println("序列号版本: " + generateCourseCodeWithSequence());
            System.out.println("混合版本: " + generateCourseCodeMixed());
            System.out.println("---");
        }
        
        // 测试验证功能
        String testCode = "23041523";
        System.out.println("测试代码: " + testCode);
        System.out.println("是否有效: " + isValidCourseCode(testCode));
        System.out.println("日期部分: " + getDateString(testCode));
        System.out.println("后缀部分: " + getSuffix(testCode));
    }
}
